package com.cc.od.boss;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/*
@description:华为OD机试真题----BOSS的收入
             题目描述
                给定一个销售团队（或代理商层级）中的成员数量N。
                对于每个成员,给出其ID、直接上级的ID以及该成员的销售额（或赚的钱）。
                boss的直接上级ID为0。
                需要计算并输出boss的总收入。
                输入描述
                第一行输入一个整数N，表示销售团队中的成员数量。
                接下来的N行,每行包含三个整数:销售员的ID、该销售员的直接上级的ID、该销售员的销售额（或赚的钱）。
                输出描述
                输出一行，包含两个整数,用空格分隔。第一个是boss的ID（应为0）,第二个是Boss的总收入。
                示例
                输入:
                3
                1 0 223
                2 0 323
                3 2 1203
                第一个销售员（ID为1）销售额为223元,直接上级为Boss（ID为0）,因此Boss从销售员1处获得223元的15%，即33.45元（但通常题目会要求取整或按特定规则处理小数）。
                第二个销售员（ID为2）销售额为323元,直接上级同样为boss,boss从销售员2处获得48.45元。
                第三个销售员（ID为3）销售额为1203元,但其直接上级是销售员2（ID为2）,销售员2从销售员3处获得180.45元,然后boss再从销售员2处获得这部分的15%,即27.07元（同样按特定规则处理小数）。
                因此，Boss的总收入为这三部分之和。
                输出（假设按整数处理小数）:
                0 109
                注意:这里的109元是示例中的简化计算结果，实际计算时可能需要考虑小数处理方式。
@ClassName BossIncomeCalculator
@author chen
@create 2024-09-29 10:09
@Version 1.0
*/
public class BossIncomeCalculator {

    private static BigDecimal bossIncome = new BigDecimal("0"); // 单独为Boss维护一个收入变量
    private static List<SalesPerson> list = new ArrayList<>();

    public static void main(String[] args)
    {
        calculateBossIncome();
    }


    public static void calculateBossIncome()
    {
        // 初始化输入数据,销售员的业绩信息
        initializeInputData();
        // 处理输入数据
        processInputData();
        // 输出结果
        System.out.println(bossIncome);
    }

    private static void processInputData()
    {
        for (SalesPerson salesPerson : list)
        {
            calculatePayment(salesPerson.getId(),salesPerson.getSales());
        }
    }

    private static void calculatePayment(int id, BigDecimal sales)
    {
        SalesPerson parentSalesPerson = findSalesPerson(id);
        Integer superiorId = parentSalesPerson.getId();
        BigDecimal paymentToSuperior = sales.multiply(new BigDecimal("0.15"));
        // 获取上级ID
        if(superiorId == 0)
        {
            bossIncome = bossIncome.add(paymentToSuperior);
        }
        else
        {
            // 找到当前销售员的上级,递归的向自己的上级支付提成
            calculatePayment(superiorId,paymentToSuperior);
        }
    }

    private static SalesPerson findSalesPerson(int id)
    {
        Optional<SalesPerson> first = list.stream().filter(item -> item.getId().equals(id)).findFirst();
        SalesPerson salesPerson = first.orElse(null);
        if(null == salesPerson)
        {
            throw new RuntimeException("没有找到对应的销售员");
        }
        Integer superiorId = salesPerson.getSuperiorId();
        if(superiorId == 0)
        {
            return new SalesPerson(0,-1,new BigDecimal("0"));
        }
        else
        {
            Optional<SalesPerson> first1 = list.stream().filter(item -> item.getId().equals(superiorId)).findFirst();
            // 没有父节点就默认父节点是boss
            return first1.orElse(new SalesPerson(0,-1,new BigDecimal("0")));
        }
    }

    private static void initializeInputData()
    {
        // 假设的输入数据
        String[] alesPersonList =
        {
                "1 0 223",
                "2 0 323",
                "3 2 1203"
        };

        list = Arrays.stream(alesPersonList).map(item -> {
            String[] parts = item.split(" ");
            return new SalesPerson(Integer.parseInt(parts[0]), Integer.parseInt(parts[1]), new BigDecimal(parts[2]));
        }).collect(Collectors.toList());
    }

}
